﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;

namespace Neturion.Negocios
{
    public class NegocioFormaPagamento
    {
        private IRepositorioFormaPagamento _repositorioFormaPagamento;

        public NegocioFormaPagamento()
        {
            _repositorioFormaPagamento = new RepositorioFormaPagamento();
        }

        public FormaPagamento Inserir(FormaPagamento formaPagamento, Usuario usuarioPermissao)
        {
            return _repositorioFormaPagamento.Inserir(formaPagamento);
        }

        public FormaPagamento Atualizar(FormaPagamento formaPagamento, Usuario usuarioPermissao)
        {
            return _repositorioFormaPagamento.Atualizar(formaPagamento);
        }

        public DateTime CalcularDataVencimentoFormaPagamento(DateTime dataEmissao, FormaPagamento formaPagamento)
        {
            DateTime dataVencimentoRetorno = new DateTime();
            int diaEmissao;
            int mesEmissao;
            int anoEmissao;
            int ultimoDiaMes;
            if ((dataEmissao != null) && (formaPagamento != null))
            {
                diaEmissao = dataEmissao.Day;
                mesEmissao = dataEmissao.Month;
                anoEmissao = dataEmissao.Year;

                //Verificar se a data de emissão é depois da data de fechamento para colocar o vencimento para o proximo mes)
                if (diaEmissao > formaPagamento.DiaFechamento)
                {
                    mesEmissao = mesEmissao + 1;
                }

                //verifica se se o Dia de Vencimento é Maior que o ultimo dia do novo Vencimento 
                ultimoDiaMes = DateTime.DaysInMonth(anoEmissao, mesEmissao);
                if (formaPagamento.DiaVencimento > ultimoDiaMes)
                {
                    //coloca o Ultimo Dia do Mes com Dia do Vencimento
                    diaEmissao = ultimoDiaMes;
                }
                else
                {
                    //coloca o Dia do Vencimento da FormaPagamento
                    diaEmissao = formaPagamento.DiaVencimento;
                }

                //Monta a Nova Data de Vencimento
                dataVencimentoRetorno = new DateTime(anoEmissao, mesEmissao, diaEmissao);
            }
            return dataVencimentoRetorno.Date;
        }

        public void Excluir(FormaPagamento formaPagamento, Usuario usuarioPermissao)
        {
            FormaPagamento formaPagamentoTmp = ObterPorId(formaPagamento.FormaPagamentoId, usuarioPermissao);
            _repositorioFormaPagamento.Excluir(formaPagamentoTmp);
        }

        public IList<FormaPagamento> ObterTodos(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string codigo, string descricao, TipoFormaPagamento tipoFormaPagamento, EnumTipoMovimentoFinanceiro enumTipoMovimentoFinanceiro)
        {
            return _repositorioFormaPagamento.ObterTodos(inicio, quantidade, quantidadeMinima, codigo, descricao, tipoFormaPagamento, enumTipoMovimentoFinanceiro);
        }

        public IList<FormaPagamento> ObterTodos(Usuario usuarioPermissao, string codigo, string descricao, TipoFormaPagamento tipoFormaPagamento, EnumTipoMovimentoFinanceiro enumTipoMovimentoFinanceiro)
        {
            return _repositorioFormaPagamento.ObterTodos(codigo, descricao, tipoFormaPagamento, enumTipoMovimentoFinanceiro);
        }

        public IList<FormaPagamento> ObterTodos(Usuario usuarioPermissao)
        {
            return _repositorioFormaPagamento.ObterTodos();
        }

        public FormaPagamento ObterPorId(int id, Usuario usuarioPermissao)
        {
            return _repositorioFormaPagamento.ObterPorId(id);
        }

        public FormaPagamento ObterPorCodigo(string codigo, Usuario usuarioPermissao)
        {
            return _repositorioFormaPagamento.ObterPorCodigo(codigo);
        }

        public IList<FormaPagamento> ObterPorTipo(EnumTipoFormaPagamento enumTipoFormaPagamento)
        {
            return _repositorioFormaPagamento.ObterPorTipo(enumTipoFormaPagamento);
        }
    }
}